/**
 * 预处理十六进制字符串，移除非十六进制字符（保留0-9, A-F, a-f）
 * @param {string} rawHex - 原始的十六进制字符串
 * @returns {string} 清理后的连续十六进制字符串
 */
function preprocessHexString(rawHex) {
    // 移除非十六进制字符（包括空格、花括号等）
    return rawHex.replace(/[^0-9A-Fa-f]/g, '');
}

/**
 * 将连续的十六进制字符串转换为Uint8Array字节数组
 * @param {string} hexString - 连续的十六进制字符串
 * @returns {Uint8Array} 字节数组
 */
function hexStringToBytes(hexString) {
    const bytes = [];
    // 每两个字符一组解析
    for (let i = 0; i < hexString.length; i += 2) {
        const byteStr = hexString.substr(i, 2);
        // 将十六进制字符串解析为十进制整数
        bytes.push(parseInt(byteStr, 16));
    }
    return new Uint8Array(bytes);
}

/**
 * 使用DataView从字节数组中解析数值，支持大端序和小端序
 * @param {Uint8Array} bytesArray - 字节数组
 * @returns {Object} 包含DataView和ArrayBuffer的对象，便于后续解析
 */
function getDataViewFromBytes(bytesArray) {
    const buffer = bytesArray.buffer;
    return new DataView(buffer);
}

/**
 * 示例解析函数 - 你需要根据实际协议修改此函数
 * @param {string} rawHexData - 原始的十六进制数据字符串
 * @returns {Object} 解析后的数据对象
 */
export function parseHexData(rawHexData) {
    // 1. 预处理
    const cleanHex = preprocessHexString(rawHexData);

    // 2. 转换为字节数组
    const bytesArray = hexStringToBytes(cleanHex);
    console.log('Bytes array:', bytesArray); // 调试用，可移除

    // 3. 获取DataView用于解析
    const dataView = getDataViewFromBytes(bytesArray);
    const result = {}; // 用于存储解析结果

    // 4. 假设的解析示例（你必须根据实际协议调整！！！）
    // 假设协议结构如下（具体偏移和类型需根据你的协议文档）：
    // 偏移0: 2字节，小端序，无符号整数 (例如 0x0248 = 584)
    // 偏移4: 4字节，大端序，无符号整数 (例如 0x00001A6A = 6762)
    try {
        // 示例1: 从偏移量0读取2字节，小端序，无符号整数
        result.field1 = dataView.getUint16(0, true);
        // 示例2: 从偏移量4读取4字节，大端序，无符号整数
        result.field2 = dataView.getUint32(4, false);
        // ... 继续根据协议解析其他字段

        // 如果你需要解析有符号数，可以使用 getInt16, getInt32 等方法
        // 例如: result.field3 = dataView.getInt32(8, true);

        // 如果你需要解析ASCII字符串，可以这样做：
        // const textDecoder = new TextDecoder('ascii');
        // result.textField = textDecoder.decode(bytesArray.slice(12, 20)); // 假设从偏移12开始，长度8字节

    } catch (error) {
        console.error('解析数据时出错:', error);
        // 可以根据需要抛出错误或返回特定错误信息
        throw new Error('数据解析失败: ' + error.message);
    }

    // 5. 返回解析结果
    return result;
}
